package gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Map;
import java.util.Set;
import javax.mail.MessagingException;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import util.Email;

/**
 * Okno 3 grafického rozhraní k dotazníku.
 *
 * @author Magda Kutišová
 */
public class Okno3 extends JFrame{

    private Map<String,String> data;
    private JPanel levyPanel;
    private JPanel pravyPanel;
    private JPanel stredniPanel;
    private JPanel dolniPanel;
    private JMenuBar menu;
    private DefaultListModel panel1Model;
    private DefaultListModel panel2Model;
    private JList panel1;
    private JList panel2;
    private JButton pridat;
    private JButton odebrat;
    private JButton odeslat;
    public boolean odeslano;

    /*************************************************************************
     * Konstruktor třídy. Uloží data z předchozího okna a spustí inicializaci tohoto okna.
     * @param data data z předchozího okna
     */
    public Okno3(Map<String,String> data){
        this.data = data;
        init();
    }

    /*************************************************************************
     * Inicializuje okno.
     */
    private void init(){
        BorderLayout vzhledOkna = new BorderLayout(20,10);
        setTitle("Dotazník - 3. část");
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setName("okno3");
        setLayout(vzhledOkna);
        setPreferredSize(new Dimension(750, 350));

        levyPanel = new JPanel();
        levyPanel.setName("levyPanel");
        pravyPanel = new JPanel();
        pravyPanel.setName("pravyPanel");
        stredniPanel = new JPanel();
        stredniPanel.setName("stredniPanel");
        dolniPanel = new JPanel();
        dolniPanel.setName("dolniPanel");

        panel1Model = new DefaultListModel();
        panel1 = new JList(panel1Model);
        panel1.setName("panel1");
        panel2Model = new DefaultListModel();
        panel2 = new JList(panel2Model);
        panel2.setName("panel2");

        panel1Model.addElement("Administrativa");
        panel1Model.addElement("Bankovnictví a pojišťovnictví");
        panel1Model.addElement("Ekonomika a podnikové finance");
        panel1Model.addElement("Farmacie");
        panel1Model.addElement("Chemie a potravinářství");
        panel1Model.addElement("IT");
        panel1Model.addElement("Kultura, umění a tvůrčí práce");
        panel1Model.addElement("Kvalita a kontrola jakosti");
        panel1Model.addElement("Logistika a doprava");
        panel1Model.addElement("Marketing");
        panel1Model.addElement("Média, reklama a PR");
        panel1Model.addElement("Nákup");
        panel1Model.addElement("Personalistika a lidské zdroje");
        panel1Model.addElement("Právní služby");
        panel1Model.addElement("Prodej a obchod");
        panel1Model.addElement("Služby");
        panel1Model.addElement("Státní a veřejná správa");
        panel1Model.addElement("Stavebnictví a reality");
        panel1Model.addElement("Strojírenství");
        panel1Model.addElement("Technika a elektrotechnika");
        panel1Model.addElement("Telekomunikace");
        panel1Model.addElement("Věda a výzkum");
        panel1Model.addElement("Vrcholový management");
        panel1Model.addElement("Výroba a průmysl");
        panel1Model.addElement("Vzdělávání a školství");
        panel1Model.addElement("Zdravotnictví a sociální péče");

        levyPanel.setLayout(new BoxLayout(levyPanel, BoxLayout.Y_AXIS));
        levyPanel.add(new JLabel("Obory k dispozici:"));
        JScrollPane obalPanel1 = new JScrollPane(panel1);
        levyPanel.add(obalPanel1);

        stredniPanel.setLayout(new BoxLayout(stredniPanel, BoxLayout.Y_AXIS));
        pridat = new JButton("Přidat \u25ba");
        odebrat = new JButton("\u25c4 Odebrat");
        stredniPanel.add(Box.createRigidArea(new Dimension(0,50)));
        stredniPanel.add(pridat);
        pridat.addActionListener(new Pridat());
        stredniPanel.add(Box.createRigidArea(new Dimension(0,10)));
        stredniPanel.add(odebrat);
        odebrat.addActionListener(new Odebrat());

        pravyPanel.setLayout(new BoxLayout(pravyPanel, BoxLayout.Y_AXIS));
        pravyPanel.add(new JLabel("Obory, o které máte zájem:"));
        JScrollPane obalPanel2 = new JScrollPane(panel2);
        pravyPanel.add(obalPanel2);

        odeslat = new JButton("Odeslat");
        dolniPanel.add(odeslat);
        odeslat.addActionListener(new Odeslat());

        levyPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
        pravyPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
        stredniPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

        add(levyPanel, BorderLayout.WEST);
        add(stredniPanel, BorderLayout.CENTER);
        add(pravyPanel, BorderLayout.EAST);
        add(dolniPanel, BorderLayout.SOUTH);

        initMenu();

        setJMenuBar(menu);

        pack();
        setLocationRelativeTo(null);
    }

    /*************************************************************************
     * Inicializuje menu.
     */
    private void initMenu(){
        menu = new JMenuBar();
        JMenu soubor = new JMenu("Soubor");
        soubor.setMnemonic('S');
        JMenuItem vynulovat = new JMenuItem("Vynulovat dotazník");
        vynulovat.setMnemonic('V');
        vynulovat.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, ActionEvent.CTRL_MASK));
        vynulovat.addActionListener(new Vynulovat());
        soubor.add(vynulovat);
        JMenuItem znovu = new JMenuItem("Začít znovu");
        znovu.setMnemonic('Z');
        znovu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK));
        znovu.addActionListener(new Znovu());
        soubor.add(znovu);
        JMenuItem konec = new JMenuItem("Konec");
        konec.setMnemonic('K');
        konec.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK));
        konec.addActionListener(new Konec());
        soubor.add(konec);
        menu.add(soubor);
        JMenu napoveda = new JMenu("Nápověda");
        napoveda.setMnemonic('N');
        JMenuItem informace = new JMenuItem("Informace");
        informace.setMnemonic('I');
        informace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, ActionEvent.ALT_MASK));
        informace.addActionListener(new Informace());
        JMenuItem oProgramu = new JMenuItem("O programu");
        oProgramu.setMnemonic('O');
        oProgramu.addActionListener(new OProgramu());
        napoveda.add(informace);
        napoveda.add(oProgramu);
        menu.add(napoveda);
    }

    private class Vynulovat implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            Object [] obory = panel2Model.toArray();
            if (obory.length != 0){
                for(Object obor : obory){
                    panel1Model.addElement(obor);
                    panel2Model.removeElement(obor);
                }
            }
        }

    }

    private class Znovu implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            dispose();
            Okno1 okno = new Okno1();
            okno.setVisible(true);
        }

    }

    private class Konec implements ActionListener{

        public void actionPerformed(ActionEvent e) {            
            int ukoncit = JOptionPane.showConfirmDialog(null, "Opravdu chcete ukončit vyplňování dotazníku a"
                    + " ztratit veškerá zadaná data?", "Opravdu ukončit?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if(ukoncit==0){
                System.exit(0);
            }
            else{
                return;
            }
        }

    }

    private class Informace implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            String text =
                    "<html><h1>Instrukce k vyplnění dotazníku</h1>"
                    + "<p>Pro zařazení do naší databáze zájemců o práci prosíme<br>"
                    + "vyplňte všechny tři části tohoto dotazníku.</p>"
                    + "<p>V první části vyplňte své osobní údaje a vystudované<br>"
                    + "školy. Pro přidání každé další školy vždy stiskněte příslušné<br>"
                    + "tlačítko. Povinná pole jsou označena hvězdičkou.</p>"
                    + "<p>Ve druhé části vyplňte doplňující informace o vaší osobě.<br>"
                    + "Do sekce jazyky prosím přidejte všechny jazyky, které znáte,<br>"
                    + "v takovém pořadí, jak dobře se jimi domluvíte,<br>"
                    + "čím výše, tím lepší znalost.</p>"
                    + "<p>V poslední části přetažením přesuňte oblasti, ve kterých<br>"
                    + "máte zájem pracovat, z levého seznamu do pravého a opět je<br>"
                    + "seřaďte přetažením myši, čím výše, tím raději byste v oboru<br>"
                    + "pracovali. Nakonec stiskněte tlačítko \"Odeslat\". Kopie vyplněných<br>"
                    + "údajů bude zaslána na vaši e-mailovou adresu. Děkujeme.</html>"; 
            JOptionPane.showMessageDialog(null, text, "Informace", JOptionPane.INFORMATION_MESSAGE);
        }

    }

    private class OProgramu implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            String text =
                    "<html><p>Program vytvořen v rámci bakalářské práce.</p>"
                    + "<p>Magda Kutišová, březen 2011</p></html>";
            JOptionPane.showMessageDialog(null, text, "O programu", JOptionPane.INFORMATION_MESSAGE);
        }

    }

    private class Pridat implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            Object[] obory = panel1.getSelectedValues();
            if (obory.length == 0){
                JOptionPane.showMessageDialog(null, "Nejsou vybrány žádné položky.", "Chyba", JOptionPane.ERROR_MESSAGE);
                return;
            }
            else{
                for (Object obor : obory){
                    panel2Model.addElement(obor);
                    panel1Model.removeElement(obor);
                }
            }
        }

    }

    private class Odebrat implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            Object[] obory = panel2.getSelectedValues();
                if (obory.length == 0){
                    JOptionPane.showMessageDialog(null, "Nejsou vybrány žádné položky.", "Chyba", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                else{
                    for (Object obor : obory){
                        panel1Model.addElement(obor);
                        panel2Model.removeElement(obor);
                    }
                }
            }

    }

    private class Odeslat implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            //uloží data
            Object[] obory = panel2Model.toArray();
            if(obory.length != 0){
                String seznamOboru = "";
                for (Object obor : obory){
                    seznamOboru = seznamOboru + " " + obor;
                }
                seznamOboru = seznamOboru.trim();
                data.put("49. Obory", seznamOboru);
            }
            else{
                JOptionPane.showMessageDialog(null, "Prosím vyberte obory, ve kterých byste chtěl(a) pracovat", "Chyba", JOptionPane.ERROR_MESSAGE);
                return;
            }
            SwingWorker odeslani = new SwingWorker() {

                @Override
                protected Void doInBackground() throws Exception {
                    //sestaví mail
                    String teloMailu = "";
                    Set<String> polozky = data.keySet();
                    for (String polozka : polozky){
                        teloMailu = teloMailu + polozka + ": " + data.get(polozka) + "\n";
                    }
                    Email email = new Email();
                    try {
                        email.posliMail("smtp.seznam.cz", "uchazeciTest@seznam.cz", data.get("06. E-mail"), "Nový uchazeč", teloMailu);
                        email.posliMail("smtp.seznam.cz", "uchazeciTest@seznam.cz", "uchazeciTest@seznam.cz", "Nový uchazeč", teloMailu);
                        odeslano = true;
                    } catch (MessagingException ex) {
                        odeslano = false;
                    }
                    return null;
                }

                Runnable potvrdit = new Runnable() {

                    public void run() {
                        if (odeslano){
                            int ukoncit = JOptionPane.showConfirmDialog(null, "Email s vašimi daty byl úspěšně odeslán. Chcete ukončit program?", "Úspěch", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                            if(ukoncit==0){
                                System.exit(0);
                            }
                            else{
                                return;
                            }
                        }
                        else {
                            JOptionPane.showMessageDialog(null, "Odesílání mailu selhalo. Pokud potíže přetrvají, obraťte se na tvůrce programu.", "Chyba", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                };
                
                @Override
                protected void done(){
                    SwingUtilities.invokeLater(potvrdit);
                }                
            };
            odeslani.execute();
        }

    }
    
}
